﻿using System;
using System.Globalization;
using System.Web.UI;
using System.Web.Security;
using SGAEntidades;
using System.Text;
using SGALogicaNegocio;

namespace webSGA
{
    public partial class wfSolicitudTaxi : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                lblUsuario.Text = Context.User.Identity.Name;
                Util.Util.CargarEstadoSolicitud(cboEstadoSolicitud, false);
                Util.Util.CargarMotivoViajeTaxi(cboMotivoSolicitud, true);
                Util.Util.CargarHoras(cboHora, cboMinutos);
                hfAccion.Value = "N";
            }
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            ActivarDesactivarCampos(true);
            LimpiarCampos();
            hfAccion.Value = "N";
        }

        private void LimpiarCampos()
        {
            txtIdSolicitud.Text = "";
            cboEstadoSolicitud.SelectedValue = "01";
            txtIdEmpleado.Text = "";
            txtNombreEmpleado.Text = "";
            txtAreaEmpleado.Text = "";
            txtFechaSolicitud.Text = "";
            txtPuntoPartida.Text = "";
            txtPuntoDestino.Text = "";
            cboMotivoSolicitud.SelectedValue = "-1";
            txtObservaciones.Text = "";
            txtObservacionesAprobacion.Text = "";
            txtUsuarioAprueba.Text = "";
            txtUsuarioApruebaNombre.Text = "";
        }

        private void ActivarDesactivarCampos(Boolean bEstado)
        {
            txtFechaSolicitud.Enabled = bEstado;
            txtPuntoPartida.Enabled = bEstado;
            txtPuntoDestino.Enabled = bEstado;
            cboMotivoSolicitud.Enabled = bEstado;
            txtObservaciones.Enabled = bEstado;
            cboHora.Enabled = bEstado;
            cboMinutos.Enabled = bEstado;
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                MostrarModalConfirmacion();
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió el siguiente error: " + ex.Message, alertaError, alertaExito,
                                                  lblError, lblExito);
            }
        }

        private void MostrarModalConfirmacion()
        {
            var sb = new StringBuilder();
            sb.Append(@"<script type='text/javascript'>");
            sb.Append("$('#modalConfirmacion').modal('show');");
            sb.Append(@"</script>");
            ClientScript.RegisterStartupScript(GetType(), "Show", sb.ToString());
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
        }

        protected void btnEditar_Click(object sender, EventArgs e)
        {
            ActivarDesactivarCampos(true);
            txtIdSolicitud.Enabled = false;
            txtIdEmpleado.Enabled = false;
            hfAccion.Value = "M";
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            CargarSolicitud(txtIdSolicitud.Text);
            ActivarDesactivarCampos(false);
        }

        protected void btnAprobar_Click(object sender, EventArgs e)
        {
            try
            {
                hfAccion.Value = "A";
                MostrarModalConfirmacion();
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió el siguiente error: " + ex.Message, alertaError, alertaExito,
                                                  lblError, lblExito);
            }
        }

        protected void btnCerrarSesion_Click(object sender, EventArgs e)
        {
            FormsAuthentication.SignOut();
            Response.Redirect("Login.aspx");
        }

        private void CargarSolicitud(String sIdSolicitud)
        {
            var oEntSolicitudTaxi = new SolicitudTaxiInfo(sIdSolicitud, null, null, null, null);
            oEntSolicitudTaxi = new SolicitudTaxi().Consultar(oEntSolicitudTaxi);

            if (oEntSolicitudTaxi.IdSolicitudTaxi != null)
            {
                txtIdSolicitud.Text = oEntSolicitudTaxi.IdSolicitudTaxi;
                cboEstadoSolicitud.SelectedValue = oEntSolicitudTaxi.IdEstado;
                txtIdEmpleado.Text = oEntSolicitudTaxi.IdEmpleado;
                txtNombreEmpleado.Text = oEntSolicitudTaxi.Empleado.Nombre;
                txtAreaEmpleado.Text = oEntSolicitudTaxi.Empleado.Area.Descripcion;
                if (oEntSolicitudTaxi.FechaHoraSolicitud != null)
                    txtFechaSolicitud.Text = oEntSolicitudTaxi.FechaHoraSolicitud.Value.ToShortDateString();
                if (oEntSolicitudTaxi.FechaHoraSolicitud != null)
                    cboHora.SelectedValue = oEntSolicitudTaxi.FechaHoraSolicitud.Value.Hour.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0');
                if (oEntSolicitudTaxi.FechaHoraSolicitud != null)
                    cboMinutos.SelectedValue = oEntSolicitudTaxi.FechaHoraSolicitud.Value.Minute.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0');
                txtPuntoPartida.Text = oEntSolicitudTaxi.Origen;
                txtPuntoDestino.Text = oEntSolicitudTaxi.Destino;
                cboMotivoSolicitud.SelectedValue = oEntSolicitudTaxi.IdMotivoSolicitud;
                txtObservaciones.Text = oEntSolicitudTaxi.Observaciones;
                txtUsuarioAprueba.Text = oEntSolicitudTaxi.UsuarioAprobacion; ;
                txtUsuarioApruebaNombre.Text = oEntSolicitudTaxi.EntUsuarioAprobacion.Nombre;
                txtObservacionesAprobacion.Text = oEntSolicitudTaxi.ObservacionAprobacion;
                if (oEntSolicitudTaxi.FechaAprobacion != null)
                    txtFechaAprobacion.Text =
                        oEntSolicitudTaxi.FechaAprobacion.Value.ToString(CultureInfo.InvariantCulture);
                ActivarDesactivarCampos(false);
            }
            else
            {
                Util.Util.AlternarMensaje(false, "No se encontró la solicitud indicada.", alertaError, alertaExito,
                          lblError, lblExito);
            }
        }

        protected void btnBuscarEmpleado_Click(object sender, EventArgs e)
        {
            var oEntEmpleado = new Empleado().Consultar(new EmpleadoInfo("00001"));

            if (!String.IsNullOrEmpty(oEntEmpleado.IdEmpleado))
            {
                txtIdEmpleado.Text = oEntEmpleado.IdEmpleado;
                txtNombreEmpleado.Text = oEntEmpleado.Nombre;
                txtAreaEmpleado.Text = oEntEmpleado.Area.Descripcion;
            }
            else
            {
                Util.Util.AlternarMensaje(false, "No se encontró al empledo indicado.", alertaError, alertaExito, lblError, lblExito);
            }
        }

        protected void btnBuscarSolicitud_Click(object sender, EventArgs e)
        {
            gvConsultaSolicitud.DataSource = null;
            var sb = new StringBuilder();
            sb.Append(@"<script type='text/javascript'>");
            sb.Append("$('#modalBusquedaSolicitud').modal('show');");
            sb.Append(@"</script>");
            ClientScript.RegisterStartupScript(GetType(), "Show", sb.ToString());
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
        }

        protected void btnSiGrabar_Click(object sender, EventArgs e)
        {
            GrabarSolicitud();
        }

        private void GrabarSolicitud()
        {
            var sIdSolicitud = "";
            if (ValidarInformacion())
            {
                var oEntSolicitud = new SolicitudTaxiInfo();

                var dFechaHora = new DateTime(Convert.ToDateTime(txtFechaSolicitud.Text).Year,
                                              Convert.ToDateTime(txtFechaSolicitud.Text).Month,
                                              Convert.ToDateTime(txtFechaSolicitud.Text).Day,
                                              int.Parse(cboHora.SelectedValue), int.Parse(cboMinutos.SelectedValue), 0);

                oEntSolicitud.IdEmpleado = txtIdEmpleado.Text;
                oEntSolicitud.Origen = txtPuntoPartida.Text;
                oEntSolicitud.Destino = txtPuntoDestino.Text;
                oEntSolicitud.FechaHoraSolicitud = dFechaHora;
                oEntSolicitud.IdMotivoSolicitud = cboMotivoSolicitud.SelectedValue;
                oEntSolicitud.Observaciones = txtObservaciones.Text;
                oEntSolicitud.IdEstado = cboEstadoSolicitud.SelectedValue;
                oEntSolicitud.UsuarioSistema = Context.User.Identity.Name;

                if (hfAccion.Value.Equals("N"))
                {
                    if (new SolicitudTaxi().Registrar(oEntSolicitud, ref sIdSolicitud))
                    {
                        Util.Util.AlternarMensaje(true, "Se registró la solicitud con éxito.", alertaError, alertaExito,
                                                  lblError, lblExito);
                        txtIdSolicitud.Text = sIdSolicitud;
                        CargarSolicitud(txtIdSolicitud.Text);
                    }
                    else
                    {
                        Util.Util.AlternarMensaje(false, "No se registró la solicitud.", alertaError, alertaExito, lblError, lblExito);
                    }
                }
                if (hfAccion.Value.Equals("M"))
                {
                    oEntSolicitud.IdSolicitudTaxi = txtIdSolicitud.Text;
                    if (new SolicitudTaxi().Actualizar(oEntSolicitud))
                    {
                        Util.Util.AlternarMensaje(true, "Se actualizó la solicitud con éxito.", alertaError, alertaExito,
                                                  lblError, lblExito);
                        txtIdSolicitud.Text = sIdSolicitud;
                        CargarSolicitud(txtIdSolicitud.Text);
                    }
                    else
                    {
                        Util.Util.AlternarMensaje(false, "No se actualizó la solicitud.", alertaError, alertaExito, lblError, lblExito);
                    }
                }
                if (hfAccion.Value.Equals("A") || hfAccion.Value.Equals("R"))
                {
                    oEntSolicitud.IdSolicitudTaxi = txtIdSolicitud.Text;
                    oEntSolicitud.IdEstado = hfAccion.Value.Equals("A") ? "03" : "04";
                    oEntSolicitud.UsuarioAprobacion = Context.User.Identity.Name;
                    oEntSolicitud.ObservacionAprobacion = txtObservacionesAprobacion.Text;

                    if (new SolicitudTaxi().Aprobar(oEntSolicitud))
                    {
                        Util.Util.AlternarMensaje(true, "Se aprobó la solicitud con éxito.", alertaError, alertaExito,
                                                  lblError, lblExito);
                        CargarSolicitud(txtIdSolicitud.Text);
                    }
                    else
                    {
                        Util.Util.AlternarMensaje(false, "No se aprobó la solicitud.", alertaError, alertaExito, lblError, lblExito);
                    }
                }
            }
        }

        private bool ValidarInformacion()
        {
            if (String.IsNullOrEmpty(txtIdEmpleado.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe selecionar su código de empleado.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!Util.Util.EsFechaValida(txtFechaSolicitud.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar la fecha del servicio de taxi.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (!Util.Util.EsFechaValida(txtFechaSolicitud.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar una fecha de servicio de taxi válida. Debe ser dd/mm/yyyy.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtPuntoPartida.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar el punto de partida del servicio de taxi.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (String.IsNullOrEmpty(txtPuntoDestino.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar el punto de destino del servicio de taxi.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (cboMotivoSolicitud.SelectedValue.Equals("-1"))
            {
                Util.Util.AlternarMensaje(false, "Debe seleccionar el motivo del servicio de taxi.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            if (hfAccion.Value == "R" && String.IsNullOrEmpty(txtObservacionesAprobacion.Text))
            {
                Util.Util.AlternarMensaje(false, "Debe indicar un motivo de rechazo al servicio de taxi.", alertaError, alertaExito, lblError, lblExito);
                return false;
            }

            return true;
        }

        protected void btnRechazar_Click(object sender, EventArgs e)
        {
            try
            {
                hfAccion.Value = "R";
                MostrarModalConfirmacion();
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió el siguiente error: " + ex.Message, alertaError, alertaExito,
                                                  lblError, lblExito);
            }
        }

        protected void gvConsultaSolicitud_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
        {
            try
            {
                int index = Convert.ToInt32(e.CommandArgument);
                var dataKey = gvConsultaSolicitud.DataKeys[index];
                String sIdSolicitud = "";
                if (dataKey != null)
                {
                    sIdSolicitud = dataKey.Value.ToString();
                }

                if (e.CommandName.Equals("Seleccionar"))
                {
                    CargarSolicitud(sIdSolicitud);
                    ActivarDesactivarCampos(false);

                    var sb = new StringBuilder();
                    sb.Append(@"<script type='text/javascript'>");
                    sb.Append("$('#modalBusquedaSolicitud').modal('hide');");
                    sb.Append(@"</script>");
                    ClientScript.RegisterStartupScript(GetType(), "Hide", sb.ToString());
                    ScriptManager.RegisterClientScriptBlock(this, GetType(), "ModalScript", sb.ToString(), false);
                }
            }
            catch (Exception ex)
            {
                Util.Util.AlternarMensaje(false, "Ocurrió un error: " + ex.Message, alertaError, alertaExito, lblError, lblExito);
            }
        }

        protected void btnConsultar_Click(object sender, EventArgs e)
        {
            String sIdSolicitud = String.IsNullOrEmpty(txtSolicitudBusqueda.Text.Trim())
                          ? null
                          : txtSolicitudBusqueda.Text.Trim();
            String sEmpleado = String.IsNullOrEmpty(txtEmpleadoBusqueda.Text.Trim())
                                   ? null
                                   : txtEmpleadoBusqueda.Text.Trim();
            DateTime? dFechaSolicitudDesde;
            DateTime? dFechaSolicitudHasta;
            if (String.IsNullOrEmpty(txtFechaBusquedaDesde.Text.Trim()))
                dFechaSolicitudDesde = null;
            else
            {
                dFechaSolicitudDesde = DateTime.Parse(txtFechaBusquedaDesde.Text.Trim());
                dFechaSolicitudDesde = Util.Util.HoraMinima(dFechaSolicitudDesde);
            }

            if (String.IsNullOrEmpty(txtFechaBusquedaHasta.Text.Trim()))
                dFechaSolicitudHasta = null;
            else
            {
                dFechaSolicitudHasta = DateTime.Parse(txtFechaBusquedaHasta.Text.Trim());
                dFechaSolicitudHasta = Util.Util.HoraMaxima(dFechaSolicitudHasta);
            }


            gvConsultaSolicitud.DataSource =
                new SolicitudTaxi().Listar(new SolicitudTaxiInfo(sIdSolicitud, sEmpleado, null, dFechaSolicitudDesde,
                                                                 dFechaSolicitudHasta));
            gvConsultaSolicitud.DataBind();
        }
    }
}